package ongd.web;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import ongd.negocio.gestion.Apadrinado;
import ongd.negocio.gestion.ControladorApadrinamiento;
import ongd.servicios.persistencia.exceptions.IllegalOrphanException;
import ongd.servicios.persistencia.exceptions.NonexistentEntityException;
import org.primefaces.context.RequestContext;

/**
 * Clase que se encargará de listar los apadrinados de proyectos activos.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@ManagedBean
@ViewScoped
public class Listado_Apadrinado extends ABean {

    /**
     * Objeto de tipo apadrinado que va a contener un apadrinado seleccionado.
     */
    private Apadrinado apadrinado;
    /**
     * Objeto de tipo List que va a contener todos los apadriandos que hay
     * en la base de datos.
     */
    private List<Apadrinado> apadrinados;
    /**
     * Objeto de tipo ControladorApadrinamiento que será necesario para 
     * realizar todas las operaciones necesarias para los apdrinamientos.
     */
    private ControladorApadrinamiento controlApadrin;
    /**
     * Booleano que en función de su valor indica si estamos editando o no
     * el apadrinado.
     */
    private boolean editar;
    /**
     * Objeto de tipo String que va a contener el título de la página donde
     * estemos.
     */
    private String titulo;

    /**
     * Constructor de la clase.
     */
    public Listado_Apadrinado() {
        SesionBean sesion = getSesionBean();
        if (sesion.iniciadaSesion()) {
            titulo = "Gestionar - Apadrinados";
            controlApadrin = sesion.getControladorApadrinamiento();
            apadrinado = new Apadrinado();
            apadrinados = new ArrayList<Apadrinado>();
            apadrinados = controlApadrin.obtenerApadrinadosActivos();
        }
    }

    /**
     * Método que carga los valores iniciales según una variable.
     */
    @Override
    public void cargaInicial() {
    }

    /**
     * Método que realiza las opciones adecuadas tras dar al botón de aceptar.
     * @return null.
     */
    public String aceptar() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                //Si estamos en editar, editamos al apadrinado
                if (editar) {
                    //Si el apadrinado se ha editado corectamente.
                    if (controlApadrin.editarApadrinado(apadrinado)) {
                        requestContext.addCallbackParam("apadrinadoOK", true);
                    } else {
                        requestContext.addCallbackParam("noEditado", true);
                    }
                }
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(Listado_Apadrinado.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(Listado_Apadrinado.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(Listado_Apadrinado.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que borra un apadrinado de la base de datos.
     * @return null.
     */
    public String borrar() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                if (controlApadrin.borrarApadrinado(apadrinado, false)) {
                    requestContext.addCallbackParam("apadrinadoBorradoOK", true);
                    apadrinados = controlApadrin.obtenerApadrinados();
                } else {
                    requestContext.addCallbackParam("noBorrado", true);
                }
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(Listado_Apadrinado.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(Listado_Apadrinado.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que modifica la variable editar para permitir editar al apadrinado.
     * @return null.
     */
    public String editar() {
        editar = true;
        return null;
    }

    /**
     * Método que modifica la variable editar para consultar al apadrinado.
     * @return null.
     */
    public String consultar() {
        editar = false;
        return null;
    }

    /**
     * Método que devuelve el apadrinado con el que estamos trabajando.
     * @return apadrinado.
     * @see #setApadrinado
     */
    public Apadrinado getApadrinado() {
        return apadrinado;
    }

    /**
     * Método que devuelve la lista de apadrinados.
     * @return null.
     * @see #setApadrinados
     */
    public List<Apadrinado> getApadrinados() {
        return apadrinados;
    }

    /**
     * Método que devuelve el controlador de apadrinamiento.
     * @return controlador.
     * @see #setControlApadrin
     */
    public ControladorApadrinamiento getControlApadrin() {
        return controlApadrin;
    }

    /**
     * Método que nos dice si vamos a editar el apadrinado.
     * @return true si le vamos a editar.
     *          false si solo vamos a permitir consultar sus datos.
     */
    public boolean isEditar() {
        return editar;
    }

    /**
     * Método que da un nuevo valor al apadrinado.
     * @param apadrinado nuevo valor. 
     * @see #getApadrinado
     */
    public void setApadrinado(Apadrinado apadrinado) {
        this.apadrinado = apadrinado;
    }

    /**
     * Método que da un nuevo valor a la lista de apadrinados.
     * @param apadrinados nueva lista. 
     * @see #getApadrinados
     */
    public void setApadrinados(List<Apadrinado> apadrinados) {
        this.apadrinados = apadrinados;
    }

    /**
     * Método que da un nuevo valor al controlador de apadrinamiento.
     * @param controlApadrin nuevo controlador. 
     * @see #getControlApadrin
     */
    public void setControlApadrin(ControladorApadrinamiento controlApadrin) {
        this.controlApadrin = controlApadrin;
    }

    /**
     * Método que asigna  un nuevo valor a la variable.
     * @param editar nuevo valor de la variable. 
     */
    public void setEditar(boolean editar) {
        this.editar = editar;
    }

    /**
     * Método que devuelve el valor de la variable titulo.
     * @return titulo
     * @see #setTitulo
     */
    public String getTitulo() {
        return titulo;
    }

    /**
     * Método que establece el valor de la variable título.
     * @param titulo Nuevo valor de la variable
     * @see #getTitulo
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
}
